﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 场景题：图像编辑器
 场景描述：
    在一个图形编辑软件中，用户可以选择创建不同类型的图形和设置不同的颜色。
    为了实现这个功能，你决定使用抽象工厂模式，这样可以使图形和颜色的创建过程更加灵活和可扩展。
 */
namespace CS_BEGINNER_TO_PROFICIENT.DesignPatterns.CreationMode.AbstractFactoryPattern
{
    // 抽象产品 Shape
    public interface IShape
    {
        void Draw();
    }

    // 具体产品 Rectangle
    public class Rectangle : IShape
    {
        public void Draw()
        {
            Console.WriteLine("Inside Rectangle::draw() method.");
        }
    }

    // 具体产品 Square
    public class Square : IShape
    {
        public void Draw()
        {
            Console.WriteLine("Inside Square::draw() method.");
        }
    }

    // 具体产品 Circle
    public class Circle : IShape
    {
        public void Draw()
        {
            Console.WriteLine("Inside Circle::draw() method.");
        }
    }

    // 抽象产品 Color
    public interface IColor
    {
        void Fill();
    }

    // 具体产品 Red
    public class Red : IColor
    {
        public void Fill()
        {
            Console.WriteLine("Inside Red::fill() method.");
        }
    }

    // 具体产品 Green
    public class Green : IColor
    {
        public void Fill()
        {
            Console.WriteLine("Inside Green::fill() method.");
        }
    }

    // 具体产品 Blue
    public class Blue : IColor
    {
        public void Fill()
        {
            Console.WriteLine("Inside Blue::fill() method.");
        }
    }

    // 抽象工厂 IGraphicalEditor
    public interface IGraphicalEditorFactory
    {
        IShape CreateShape();

        IColor CreateColor();
    }

    // 具体工厂 SquareAndRedEditorFactory
    public class SquareAndRedEditorFactory : IGraphicalEditorFactory
    {
        public IColor CreateColor()
        {
            return new Red();
        }

        public IShape CreateShape()
        {
            return new Square();
        }
    }

    // 客户端
    public class GraphicalEditor
    {
        private readonly IShape _shape;
        private readonly IColor _color;

        public GraphicalEditor(IGraphicalEditorFactory factory)
        {
            _shape = factory.CreateShape();
            _color = factory.CreateColor();
        }

        public void Show()
        {
            _shape.Draw();
            _color.Fill();
        }
    }
}
